/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_crypto_api.h
 *
 * @brief 提供加密操作的API。
 *
 * 您可以使用这些API实现加密和解密。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_crypto_api.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef TEE_CRYPTO_API_H
#define TEE_CRYPTO_API_H

#include <pthread.h>
#include <tee_defines.h>
#include <tee_mem_mgmt_api.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef NULL
/**
 * @brief 定义NULL。
 *
 * @since 20
 */
#define NULL ((void *)0)
#endif
/**
 * @brief 定义最大密钥长度（单位：比特）。
 *
 * @since 20
 */
#define TEE_MAX_KEY_SIZE_IN_BITS      (1024 * 8)

/**
 * @brief 定义SW_RSA 密钥的长度（单位：字节）。
 *
 * @since 20
 */
#define SW_RSA_KEYLEN                 1024

/**
 * @brief 定义其他Diffie-Hellman(DH)信息的最大长度（单位：字节）。
 *
 * @since 20
 */
#define TEE_DH_MAX_SIZE_OF_OTHER_INFO 64

/**
 * @brief 定义最大参数数量。
 *
 * @since 20
 */
#define TEE_PARAM_COUNT_MAX 9

/**
 * @brief 枚举加密操作句柄类型。
 *
 * @since 20
 */
enum __TEE_Operation_Constants {
    /** 对称加密操作。 */
    TEE_OPERATION_CIPHER               = 0x1,
    /** 消息认证码操作。 */
    TEE_OPERATION_MAC                  = 3,
    /** 认证加密操作。 */
    TEE_OPERATION_AE                   = 4,
    /** 摘要算法操作。 */
    TEE_OPERATION_DIGEST               = 5,
    /** 非对称加密操作。 */
    TEE_OPERATION_ASYMMETRIC_CIPHER    = 6,
    /** 非对称签名操作。 */
    TEE_OPERATION_ASYMMETRIC_SIGNATURE = 7,
    /** 密钥派生操作。 */
    TEE_OPERATION_KEY_DERIVATION       = 8,
    /** KDF密钥派生操作。 */
    TEE_OPERATION_KDF_KEY_DERIVATION   = 9,
};

/**
 * @brief 枚举加密算法。
 *
 * @since 20
 */
enum __tee_crypto_algorithm_id {
    /** 非法算法。 */
    TEE_ALG_INVALID                      = 0x0,
    /** AES_ECB_NOPAD算法。 */
    TEE_ALG_AES_ECB_NOPAD                = 0x10000010,
    /** AES_CBC_NOPAD算法。 */
    TEE_ALG_AES_CBC_NOPAD                = 0x10000110,
    /** AES_CTR算法。 */
    TEE_ALG_AES_CTR                      = 0x10000210,
    /** AES_CTS算法。 */
    TEE_ALG_AES_CTS                      = 0x10000310,
    /** AES_XTS算法。 */
    TEE_ALG_AES_XTS                      = 0x10000410,
    /** AES_CBC_MAC_NOPAD算法。 */
    TEE_ALG_AES_CBC_MAC_NOPAD            = 0x30000110,
    /** AES_CBC_MAC_PKCS5算法。 */
    TEE_ALG_AES_CBC_MAC_PKCS5            = 0x30000510,
    /** AES_CMAC算法。 */
    TEE_ALG_AES_CMAC                     = 0x30000610,
    /** AES_GMAC算法。 */
    TEE_ALG_AES_GMAC                     = 0x30000810,
    /** AES_CCM算法。 */
    TEE_ALG_AES_CCM                      = 0x40000710,
    /** AES_GCM算法。 */
    TEE_ALG_AES_GCM                      = 0x40000810,
    /** DES_ECB_NOPAD算法。 */
    TEE_ALG_DES_ECB_NOPAD                = 0x10000011,
    /** DES_CBC_NOPAD算法。 */
    TEE_ALG_DES_CBC_NOPAD                = 0x10000111,
    /** DES_CBC_MAC_NOPAD算法。 */
    TEE_ALG_DES_CBC_MAC_NOPAD            = 0x30000111,
    /** DES_CBC_MAC_PKCS5算法。 */
    TEE_ALG_DES_CBC_MAC_PKCS5            = 0x30000511,
    /** DES3_ECB_NOPAD算法。 */
    TEE_ALG_DES3_ECB_NOPAD               = 0x10000013,
    /** DES3_CBC_NOPAD算法。 */
    TEE_ALG_DES3_CBC_NOPAD               = 0x10000113,
    /** DES3_CBC_MAC_NOPAD算法。 */
    TEE_ALG_DES3_CBC_MAC_NOPAD           = 0x30000113,
    /** DES3_CBC_MAC_PKCS5算法。 */
    TEE_ALG_DES3_CBC_MAC_PKCS5           = 0x30000513,
    /** RSASSA_PKCS1_V1_5_MD5签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_MD5        = 0x70001830,
    /** RSASSA_PKCS1_V1_5_SHA1签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SHA1       = 0x70002830,
    /** RSASSA_PKCS1_V1_5_SHA224签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SHA224     = 0x70003830,
    /** RSASSA_PKCS1_V1_5_SHA256签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SHA256     = 0x70004830,
    /** RSASSA_PKCS1_V1_5_SHA384签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SHA384     = 0x70005830,
    /** RSASSA_PKCS1_V1_5_SHA512签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SHA512     = 0x70006830,
    /** RSASSA_PKCS1_V1_5_SM3签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_SM3        = 0xF0007830,
    /** RSASSA_PKCS1_V1_5_MD5_SHA1签名算法。 */
    TEE_ALG_RSASSA_PKCS1_V1_5_MD5_SHA1   = 0xF0008830,
    /** RSASSA_PKCS1_PSS_MGF1_MD5签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_MD5    = 0x70111930,
    /** RSASSA_PKCS1_PSS_MGF1_SHA1签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1   = 0x70212930,
    /** RSASSA_PKCS1_PSS_MGF1_SHA224签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224 = 0x70313930,
    /** RSASSA_PKCS1_PSS_MGF1_SHA256签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256 = 0x70414930,
    /** RSASSA_PKCS1_PSS_MGF1_SHA384签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384 = 0x70515930,
    /** RSASSA_PKCS1_PSS_MGF1_SHA512签名算法。 */
    TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512 = 0x70616930,
    /** RSAES_PKCS1_V1_5加密算法。 */
    TEE_ALG_RSAES_PKCS1_V1_5             = 0x60000130,
    /** RSAES_PKCS1_OAEP_MGF1_SHA1加密算法。 */
    TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1   = 0x60210230,
    /** RSAES_PKCS1_OAEP_MGF1_SHA224加密算法。 */
    TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA224 = 0x60211230,
    /** RSAES_PKCS1_OAEP_MGF1_SHA256加密算法。 */
    TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256 = 0x60212230,
    /** RSAES_PKCS1_OAEP_MGF1_SHA384加密算法。 */
    TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA384 = 0x60213230,
    /** RSAES_PKCS1_OAEP_MGF1_SHA512加密算法。 */
    TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512 = 0x60214230,
    /** RSA_NOPAD加密算法。 */
    TEE_ALG_RSA_NOPAD                    = 0x60000030,
    /** DSA_SHA1签名算法。 */
    TEE_ALG_DSA_SHA1                     = 0x70002131,
    /** DSA_SHA224签名算法。 */
    TEE_ALG_DSA_SHA224                   = 0x70003131,
    /** DSA_SHA256签名算法。 */
    TEE_ALG_DSA_SHA256                   = 0x70004131,
    /** DH密钥协商算法。 */
    TEE_ALG_DH_DERIVE_SHARED_SECRET      = 0x80000032,
    /** MD5摘要算法。 */
    TEE_ALG_MD5                          = 0x50000001,
    /** SHA1摘要算法。 */
    TEE_ALG_SHA1                         = 0x50000002,
    /** SHA224摘要算法。 */
    TEE_ALG_SHA224                       = 0x50000003,
    /** SHA256摘要算法。 */
    TEE_ALG_SHA256                       = 0x50000004,
    /** SHA384摘要算法。 */
    TEE_ALG_SHA384                       = 0x50000005,
    /** SHA512摘要算法。 */
    TEE_ALG_SHA512                       = 0x50000006,
    /** HMAC_MD5消息认证算法。 */
    TEE_ALG_HMAC_MD5                     = 0x30000001,
    /** HMAC_SHA1消息认证算法。 */
    TEE_ALG_HMAC_SHA1                    = 0x30000002,
    /** HMAC_SHA224消息认证算法。 */
    TEE_ALG_HMAC_SHA224                  = 0x30000003,
    /** HMAC_SHA256消息认证算法。 */
    TEE_ALG_HMAC_SHA256                  = 0x30000004,
    /** HMAC_SHA384消息认证算法。 */
    TEE_ALG_HMAC_SHA384                  = 0x30000005,
    /** HMAC_SHA512消息认证算法。 */
    TEE_ALG_HMAC_SHA512                  = 0x30000006,
    /** HMAC_SM3消息认证算法。 */
    TEE_ALG_HMAC_SM3                     = 0x30000007,
    /** AES_ECB_PKCS5加密算法。 */
    TEE_ALG_AES_ECB_PKCS5                = 0x10000020,
    /** AES_CBC_PKCS5加密算法。 */
    TEE_ALG_AES_CBC_PKCS5                = 0x10000220,
    /** AES_CBC_ISO_PADDING加密算法。 */
    TEE_ALG_AES_CBC_ISO_PADDING          = 0x10000330,
    /** ECDSA_SHA1签名算法。 */
    TEE_ALG_ECDSA_SHA1                   = 0x70001042,
    /** ECDSA_SHA224签名算法。 */
    TEE_ALG_ECDSA_SHA224                 = 0x70002042,
    /** ECDSA_SHA256签名算法。 */
    TEE_ALG_ECDSA_SHA256                 = 0x70003042,
    /** ECDSA_SHA384签名算法。 */
    TEE_ALG_ECDSA_SHA384                 = 0x70004042,
    /** ECDSA_SHA512签名算法。 */
    TEE_ALG_ECDSA_SHA512                 = 0x70005042,
    /** ED25519签名算法。 */
    TEE_ALG_ED25519                      = 0x70005043,
    /** ECDH密钥协商算法。 */
    TEE_ALG_ECDH_DERIVE_SHARED_SECRET    = 0x80000042,
    /** X25519密钥协商算法。 */
    TEE_ALG_X25519                       = 0x80000044,
    /** ECC算法通用标识。 */
    TEE_ALG_ECC                          = 0x80000001,
    /** ECDSA_P192签名算法。 */
    TEE_ALG_ECDSA_P192                   = 0x70001042,
    /** ECDSA_P224签名算法。 */
    TEE_ALG_ECDSA_P224                   = 0x70002042,
    /** ECDSA_P256签名算法。 */
    TEE_ALG_ECDSA_P256                   = 0x70003042,
    /** ECDSA_P384签名算法。 */
    TEE_ALG_ECDSA_P384                   = 0x70004042,
    /** ECDSA_P521签名算法。 */
    TEE_ALG_ECDSA_P521                   = 0x70005042,
    /** ECDH_P192密钥协商算法。 */
    TEE_ALG_ECDH_P192                    = 0x80001042,
    /** ECDH_P224密钥协商算法。 */
    TEE_ALG_ECDH_P224                    = 0x80002042,
    /** ECDH_P256密钥协商算法。 */
    TEE_ALG_ECDH_P256                    = 0x80003042,
    /** ECDH_P384密钥协商算法。 */
    TEE_ALG_ECDH_P384                    = 0x80004042,
    /** ECDH_P521密钥协商算法。 */
    TEE_ALG_ECDH_P521                    = 0x80005042,
    /** SIP_HASH哈希算法 */
    TEE_ALG_SIP_HASH                     = 0xF0000002,
    /** SM2_DSA_SM3国密签名算法 */
    TEE_ALG_SM2_DSA_SM3                  = 0x70006045,
    /** SM2_PKE国密加密算法 */
    TEE_ALG_SM2_PKE                      = 0x80000045,
    /** SM3摘要算法。 */
    TEE_ALG_SM3                          = 0x50000007,
    /** SM4_ECB_NOPAD加密算法。 */
    TEE_ALG_SM4_ECB_NOPAD                = 0x10000014,
    /** SM4_ECB_PKCS7加密算法。 */
    TEE_ALG_SM4_ECB_PKCS7                = 0x10000024,
    /** SM4_CBC_NOPAD加密算法。 */
    TEE_ALG_SM4_CBC_NOPAD                = 0x10000114,
    /** SM4_CBC_PKCS7加密算法。 */
    TEE_ALG_SM4_CBC_PKCS7                = 0xF0000003,
    /** SM4_CTR加密算法。 */
    TEE_ALG_SM4_CTR                      = 0x10000214,
    /** SM4_CFB128加密算法。 */
    TEE_ALG_SM4_CFB128                   = 0xF0000000,
    /** SM4_XTS加密算法。 */
    TEE_ALG_SM4_XTS                      = 0x10000414,
    /** SM4_OFB加密算法。 */
    TEE_ALG_SM4_OFB                      = 0x10000514,
    /** AES_OFB加密算法。 */
    TEE_ALG_AES_OFB                      = 0x10000510,
    /** AES_CFB128加密算法。 */
    TEE_ALG_AES_CFB128                   = 0xF0000610,
    /** SM4_GCM加密算法。 */
    TEE_ALG_SM4_GCM                      = 0xF0000005,
    /** PBKDF2_HMAC_SHA1密钥派生算法。 */
    TEE_ALG_PBKDF2_HMAC_SHA1_DERIVE_KEY  = 0x800020C2,
    /** PBKDF2_HMAC_SHA256密钥派生算法。 */
    TEE_ALG_PBKDF2_HMAC_SHA256_DERIVE_KEY = 0x800040C2,
    /** PBKDF2_HMAC_SHA384密钥派生算法。 */
    TEE_ALG_PBKDF2_HMAC_SHA384_DERIVE_KEY = 0x800050C2,
    /** PBKDF2_HMAC_SHA512密钥派生算法。 */
    TEE_ALG_PBKDF2_HMAC_SHA512_DERIVE_KEY = 0x800060C2,
    /** HKDF密钥派生算法。 */
    TEE_ALG_HKDF                         = 0x80000047,
    /** PRF伪随机函数算法。 */
    TEE_ALG_PRF                          = 0xF0000006,
};

/**
 * @brief 定义了加密算法标识符。
 * @see __tee_crypto_algorithm_id
 *
 * @since 20
 */
typedef enum __tee_crypto_algorithm_id tee_crypto_algorithm_id;

/**
 * @brief 没有可用元素。
 *
 * @since 20
 */
#define TEE_OPTIONAL_ELEMENT_NONE 0x00000000

/**
 * @brief 枚举支持的椭圆曲线密码学（ECC）曲线。
 *
 * @since 20
 */
typedef enum {
    /** CURVE_NIST_P192。 */
    TEE_ECC_CURVE_NIST_P192 = 0x00000001,
    /** CURVE_NIST_P224。 */
    TEE_ECC_CURVE_NIST_P224 = 0x00000002,
    /** CURVE_NIST_P256。 */
    TEE_ECC_CURVE_NIST_P256 = 0x00000003,
    /** CURVE_NIST_P384。 */
    TEE_ECC_CURVE_NIST_P384 = 0x00000004,
    /** CURVE_NIST_P521。 */
    TEE_ECC_CURVE_NIST_P521 = 0x00000005,
    /** CURVE_SM2 256位。 */
    TEE_ECC_CURVE_SM2       = 0x00000300,
    /** CURVE_25519 256位。 */
    TEE_ECC_CURVE_25519     = 0x00000200,
} TEE_ECC_CURVE;

/**
 * @brief 枚举掩码生成函数（MGF1）模式。
 *
 * @since 20
 */
typedef enum {
    /** 使用SHA-1哈希算法。 */
    TEE_DH_HASH_SHA1_mode   = 0,
    /** 使用SHA-224哈希算法。 */
    TEE_DH_HASH_SHA224_mode = 1,
    /** 使用SHA-256哈希算法。 */
    TEE_DH_HASH_SHA256_mode = 2,
    /** 使用SHA-384哈希算法。 */
    TEE_DH_HASH_SHA384_mode = 3,
    /** 使用SHA-512哈希算法。 */
    TEE_DH_HASH_SHA512_mode = 4,
    /** 哈希模式数量。 */
    TEE_DH_HASH_NumOfModes,
} TEE_DH_HASH_Mode;

/**
 * @brief 枚举Diffie-Hellman操作模式。
 *
 * @since 20
 */
typedef enum {
    /** PKCS3模式。 */
    TEE_DH_PKCS3_mode = 0,
    /** ANSI X9.42算法模式。 */
    TEE_DH_ANSI_X942_mode = 1,
    /** 模式数量。 */
    TEE_DH_NumOfModes,
} TEE_DH_OpMode_t;

/**
 * @brief 定义TEE_DH_DerivFuncMode的枚举类型。
 *
 * @since 20
 */
typedef enum {
    /** ASN.1派生模式。 */
    TEE_DH_ASN1_DerivMode = 0,
    /** 拼接派生模式。 */
    TEE_DH_ConcatDerivMode = 1,
    /** X9.63派生模式（与拼接派生模式相同）。 */
    TEE_DH_X963_DerivMode = TEE_DH_ConcatDerivMode,
    /** OMADRM派生模式。 */
    TEE_DH_OMADRM_DerivMode = 2,
    /** ISO18033 KDF1派生模式。 */
    TEE_DH_ISO18033_KDF1_DerivMode = 3,
    /** ISO18033 KDF2派生模式。 */
    TEE_DH_ISO18033_KDF2_DerivMode = 4,
    /** 模式数量。 */
    TEE_DH_DerivFunc_NumOfModes,
} TEE_DH_DerivFuncMode;

/**
 * @brief 枚举加密操作中使用的对象属性类型。
 *
 * @since 20
 */
enum __TEE_DK_ObjectAttribute {
    /** 指向共享密钥值的指针。 */
    TEE_DK_SECRECT = 0,
    /** 指向包含其他数据的结构体的指针。 */
    TEE_DK_OTHER,
    /** 要使用的哈希函数的枚举ID。 */
    TEE_DK_HASH_MODE,
    /** 派生函数模式的枚举ID。 */
    TEE_DK_DERIVATION_MODE
};

/**
 * @brief 定义__TEE_DK_ObjectAttribute的类型别名结构体。
 *
 * @see __TEE_DK_ObjectAttribute
 *
 * @since 20
 */
typedef enum __TEE_DK_ObjectAttribute tee_dk_objectattribute;

/**
 * @brief 枚举加密操作模式。
 *
 * @since 20
 */
enum __TEE_OperationMode {
    /** 加密。 */
    TEE_MODE_ENCRYPT = 0x0,
    /** 解密。 */
    TEE_MODE_DECRYPT,
    /** 签名。 */
    TEE_MODE_SIGN,
    /** 签名验证。 */
    TEE_MODE_VERIFY,
    /** 消息认证码 (MAC)。 */
    TEE_MODE_MAC,
    /** 摘要。 */
    TEE_MODE_DIGEST,
    /** 密钥派生。 */
    TEE_MODE_DERIVE
};

/**
 * @brief 枚举加密操作状态。
 *
 * @since 20
 */
enum tee_operation_state {
    /** 初始状态。 */
    TEE_OPERATION_STATE_INITIAL = 0x00000000,
    /** 激活状态。 */
    TEE_OPERATION_STATE_ACTIVE  = 0x00000001,
};

/**
 * @brief 定义加密操作的模式类型。
 *
 * @since 20
 */
typedef uint32_t TEE_OperationMode;

/**
 * @brief 定义TEE_DH_OtherInfo的结构体。
 *
 * @since 20
 */
typedef struct {
    /** 对象标识符（OID）。 */
    uint8_t algorithm_id[TEE_DH_MAX_SIZE_OF_OTHER_INFO];
    /** AlgorithmID的长度。 */
    uint32_t size_of_algorithm_id;
    /** 发送方的公有信息。 */
    uint8_t party_u_info[TEE_DH_MAX_SIZE_OF_OTHER_INFO];
    /** PartyUInfo的长度。 */
    uint32_t size_of_party_u_info;
    /** 接收方的公有信息。 */
    uint8_t party_v_info[TEE_DH_MAX_SIZE_OF_OTHER_INFO];
    /** PartyVInfo的长度。 */
    uint32_t size_of_party_v_info;
    /** 共享的私有信息。 */
    uint8_t supp_priv_info[TEE_DH_MAX_SIZE_OF_OTHER_INFO];
    /** SuppPrivInfo的长度。 */
    uint32_t size_of_supp_priv_info;
    /** 共享的公有信息。 */
    uint8_t supp_pub_info[TEE_DH_MAX_SIZE_OF_OTHER_INFO];
    /** SuppPubInfo的长度。 */
    uint32_t size_of_supp_pub_info;
} TEE_DH_OtherInfo;

/**
 * @brief 定义操作信息。
 *
 * @since 20
 */
struct __TEE_OperationInfo {
    /** 算法ID。 */
    uint32_t algorithm;
    /** 操作类型。 */
    uint32_t operationClass;
    /** 操作模式。 */
    uint32_t mode;
    /** 摘要长度。 */
    uint32_t digestLength;
    /** 最大密钥长度。 */
    uint32_t maxKeySize;
    /** 密钥长度。 */
    uint32_t keySize;
    /** 所需的密钥使用。 */
    uint32_t requiredKeyUsage;
    /** 句柄状态。 */
    uint32_t handleState;
    /** 密钥。 */
    void *keyValue;
};

/**
 * @brief 定义__TEE_OperationInfo结构体。
 *
 * @see __TEE_OperationInfo
 */
typedef struct __TEE_OperationInfo TEE_OperationInfo;

/**
 * @brief 定义存储在OperationInfo中的密钥信息。
 *
 * @since 20
 */
typedef struct {
    /** 密钥长度。 */
    uint32_t keySize;
    /** 所需的密钥使用。 */
    uint32_t requiredKeyUsage;
} TEE_OperationInfoKey;

/**
 * @brief 定义关于操作的信息。
 *
 * @since 20
 */
typedef struct {
    /** 算法ID。 */
    uint32_t algorithm;
    /** 操作类型。 */
    uint32_t operationClass;
    /** 操作模式。 */
    uint32_t mode;
    /** 摘要长度。*/
    uint32_t digestLength;
    /** 最大密钥长度。 */
    uint32_t maxKeySize;
    /** 句柄状态。 */
    uint32_t handleState;
    /** 操作状态。 */
    uint32_t operationState;
    /** 密钥数量。 */
    uint32_t numberOfKeys;
    /** 密钥信息。 */
    TEE_OperationInfoKey keyInformation[];
} TEE_OperationInfoMultiple;

/**
 * @brief 定义加密操作句柄。
 *
 * @since 20
 */
struct __TEE_OperationHandle {
    /** 算法ID。 */
    uint32_t algorithm;
    /** 操作类型。 */
    uint32_t operationClass;
    /** 操作模式。 */
    uint32_t mode;
    /** 摘要长度。 */
    uint32_t digestLength;
    /** 最大密钥长度。 */
    uint32_t maxKeySize;
    /** 密钥长度。 */
    uint32_t keySize;
    /** 第二个密钥长度。 */
    uint32_t keySize2;
    /** 必要的密钥使用方式。 */
    uint32_t requiredKeyUsage;
    /** 句柄状态。 */
    uint32_t handleState;
    /** 密钥。 */
    void *keyValue;
    /** 第二个密钥。 */
    void *keyValue2;
    /** 加密上下文。 */
    void *crypto_ctxt;
    /** HMAC剩余上下文。 */
    void *hmac_rest_ctext;
    /** IV（初始向量）的长度。 */
    uint32_t IVLen;
    /** 指向TEE_DH_OtherInfo结构体的指针。 */
    TEE_DH_OtherInfo *dh_otherinfo;
    /** DH操作中使用的哈希模式。 */
    uint32_t dh_hash_mode;
    /** DH密钥派生函数模式。 */
    uint32_t dh_derive_func;
    /** DH操作模式。 */
    uint32_t dh_op_mode;
    /** 指向DH素数的指针。 */
    void *dh_prime;
    /** DH素数的字节长度。 */
    uint32_t dh_prime_size;
    /** 操作加锁使用的互斥锁。 */
    pthread_mutex_t operation_lock;
    /** 指向HAL层信息的指针。 */
    void *hal_info;
};

/**
 * @brief 定义用于转换整数的数据。
 *
 * @since 20
 */
typedef struct {
    /** 源数据。 */
    uint32_t src;
    /** 目标数据。 */
    uint32_t dest;
} crypto_uint2uint;

/**
 * @brief 定义RSA公钥的最大长度。
 *
 * @since 20
 */
#define RSA_PUBKEY_MAXSIZE sizeof(CRYS_RSAUserPubKey_t)

/**
 * @brief 定义RSA私钥的最大长度。
 *
 * @since 20
 */
#define RSA_PRIVKEY_MAXSIZE sizeof(CRYS_RSAUserPrivKey_t)

/**
 * @brief 定义一个结构体来保存输入和输出数据。
 *
 * @since 20
 */
typedef struct {
    /** 源数据。 */
    void *src_data;
    /** 源数据的长度。 */
    size_t src_len;
    /** 目标数据。 */
    void *dest_data;
    /** 目标数据的长度。 */
    size_t *dest_len;
} operation_src_dest;

/**
 * @brief 定义AE初始化数据。
 *
 * @since 20
 */
typedef struct {
    /** nonce */
    void *nonce;
    /** nonce的长度。 */
    size_t nonce_len;
    /** 标签的长度。 */
    uint32_t tag_len;
    /** 附加认证数据（AAD）的长度。 */
    size_t aad_len;
    /** 有效负载的长度。 */
    size_t payload_len;
} operation_ae_init;

/**
 * @brief 定义{@link __TEE_OperationHandle}结构体。
 *
 * @see __TEE_OperationHandle
 *
 * @since 20
 */
typedef struct __TEE_OperationHandle TEE_OperationHandleVar;

/**
 * @brief 定义__TEE_ObjectHandle结构体。
 *
 * @since 20
 */
typedef struct __TEE_ObjectHandle TEE_ObjectHandleVar;

/**
 * @brief 分配操作句柄。
 *
 * @param operation 操作句柄的指针。
 * @param algorithm 密码算法。
 * @param mode 操作模式。
 * @param maxKeySize 密钥的最大长度。
 *
 * @return TEE_SUCCESS：成功分配操作句柄。\n
 *         TEE_ERROR_OUT_OF_MEMORY：没有足够的内存来分配操作句柄。\n
 *         TEE_ERROR_NOT_SUPPORTED：指定的算法不被支持。\n
 *         TEE_ERROR_GENERIC：由于其他错误导致操作失败。
 * @since 20
 */
TEE_Result TEE_AllocateOperation(TEE_OperationHandle *operation, uint32_t algorithm, uint32_t mode,
    uint32_t maxKeySize);

/**
* @brief 释放操作句柄。
*
* @param operation 要释放的操作句柄。
*
* @since 20
*/
void TEE_FreeOperation(TEE_OperationHandle operation);

/**
* @brief 获取操作信息。
*
* @param operation 操作句柄。
* @param operationInfo 指向操作信息的指针。
*
* @since 20
*/
void TEE_GetOperationInfo(const TEE_OperationHandle operation, TEE_OperationInfo *operationInfo);

/**
* @brief 重置操作句柄。
*
* @param operation 要重置的操作句柄。
*
* @since 20
*/
void TEE_ResetOperation(TEE_OperationHandle operation);

/**
 * @brief 设置操作的密钥。
 *
 * @param operation 操作句柄。
 * @param key 密钥。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：由于无效参数导致操作失败。\n
 *         TEE_ERROR_OUT_OF_MEMORY：没有足够的内存来完成此操作。
 * @since 20
 */
TEE_Result TEE_SetOperationKey(TEE_OperationHandle operation, const TEE_ObjectHandle key);

/**
 * @brief 设置两个密钥供操作使用。
 *
 * @param operation 操作句柄。
 * @param key1 密钥1。
 * @param key2 密钥2。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：由于无效参数导致操作失败。\n
 * @since 20
 */
TEE_Result TEE_SetOperationKey2(TEE_OperationHandle operation, const TEE_ObjectHandle key1,
                                const TEE_ObjectHandle key2);

/**
 * @brief 复制操作句柄。
 *
 * @param dstOperation 目标操作句柄。
 * @param srcOperation 源操作句柄。
 *
 * @since 20
 */
void TEE_CopyOperation(TEE_OperationHandle dstOperation, const TEE_OperationHandle srcOperation);

/**
 * @brief 初始化上下文以启动加密操作。
 *
 * @param operation 操作句柄。
 * @param IV 指向存储操作IV的缓冲区的指针。表示此参数不使用，则设置为NULL。
 * @param IVLen IV缓冲区的长度。
 *
 * @since 20
 */
void TEE_CipherInit(TEE_OperationHandle operation, const void *IV, size_t IVLen);

/**
 * @brief 更新加密操作的数据。
 *
 * @param operation 操作句柄。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：由于无效参数导致操作失败。\n
 *         TEE_ERROR_OUT_OF_MEMORY：没有足够的内存来完成此操作。

 * @since 20
 */
TEE_Result TEE_CipherUpdate(TEE_OperationHandle operation, const void *srcData, size_t srcLen, void *destData,
                            size_t *destLen);

/**
 * @brief 完成加密操作。
 *
 * @param operation 操作句柄。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：由于无效参数导致操作失败。\n
 *         TEE_ERROR_GENERIC：由于其他错误导致操作失败。
 * @since 20
 */
TEE_Result TEE_CipherDoFinal(TEE_OperationHandle operation, const void *srcData, size_t srcLen, void *destData,
                             size_t *destLen);

/**
 * @brief 更新摘要。
 *
 * @param operation 操作句柄。
 * @param chunk 指向要散列的数据块的指针。
 * @param chunkSize 数据块的长度。
 *
 * @since 20
 */
void TEE_DigestUpdate(TEE_OperationHandle operation, const void *chunk, size_t chunkSize);

/**
 * @brief 完成消息摘要操作。
 *
 * @param operation 操作句柄。
 * @param chunk 指向要散列的数据块的指针。
 * @param chunkLen 数据块的长度。
 * @param hash 指向存储消息哈希值的缓冲区的指针。
 * @param hashLen 指向哈希长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_SHORT_BUFFER：operationInfo缓冲区不足以容纳获取的信息。
 * @since 20
 */
TEE_Result TEE_DigestDoFinal(TEE_OperationHandle operation, const void *chunk, size_t chunkLen, void *hash,
                             size_t *hashLen);

/**
 * @brief 初始化MAC操作。
 *
 * @param operation 操作句柄。
 * @param IV 指向存储操作IV的缓冲区的指针。表示此参数不使用，则设置为NULL。
 * @param IVLen IV缓冲区的长度。
 *
 * @since 20
 */
void TEE_MACInit(TEE_OperationHandle operation, void *IV, size_t IVLen);

/**
 * @brief 更新MAC。
 *
 * @param operation 操作句柄。
 * @param chunk 指向MAC数据块的指针。
 * @param chunkSize 数据块的大小。
 *
 * @since 20
 */
void TEE_MACUpdate(TEE_OperationHandle operation, const void *chunk, size_t chunkSize);

/**
 * @brief MAC操作完成，处理最后一块消息并计算MAC。
 *
 * @param operation 操作句柄。
 * @param message 指向包含最后一块消息数据的缓冲区的指针。
 * @param messageLen 消息缓冲区的长度。
 * @param mac 指向存储计算出的MAC的缓冲区的指针。
 * @param macLen 指向MAC缓冲区长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_GENERIC：操作失败。
 * @since 20
 */
TEE_Result TEE_MACComputeFinal(TEE_OperationHandle operation, const void *message, size_t messageLen, void *mac,
                               size_t *macLen);

/**
 * @brief 完成MAC操作并与传入的MAC进行比较。
 *
 * @param operation 操作句柄。
 * @param message 指向包含最后一块消息数据的缓冲区的指针。
 * @param messageLen 消息缓冲区的长度。
 * @param mac 指向存储计算出的MAC的缓冲区的指针。
 * @param macLen MAC缓冲区的长度。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_GENERIC：操作失败。\n
 *         TEE_ERROR_MAC_INVALID：计算的MAC与传入的MAC不匹配。
 * @since 20
 */
TEE_Result TEE_MACCompareFinal(TEE_OperationHandle operation, const void *message, size_t messageLen, const void *mac,
    const size_t macLen);

/**
 * @brief 推导一个密钥。
 *
 * @param operation 操作句柄。
 * @param params 指向此操作的参数的指针。
 * @param paramCount 参数的数量。
 * @param derivedKey 推导出的密钥。
 *
 * @since 20
 */
void TEE_DeriveKey(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount,
                   TEE_ObjectHandle derivedKey);

/**
 * @brief 生成随机数据。
 *
 * @param randomBuffer 指向存储生成的随机数据的缓冲区的指针。
 * @param randomBufferLen 随机数据缓冲区的长度。
 *
 * @since 20
 */
void TEE_GenerateRandom(void *randomBuffer, size_t randomBufferLen);

/**
 * @brief 初始化AE操作。
 *
 * @param operation 操作句柄。
 * @param nonce 指向存储nonce的缓冲区的指针。
 * @param nonceLen nonce的长度。
 * @param tagLen tag的长度。
 * @param AADLen AAD的长度。
 * @param payloadLen payload的长度。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_GENERIC：操作失败。
 * @since 20
 */
TEE_Result TEE_AEInit(TEE_OperationHandle operation, void *nonce, size_t nonceLen, uint32_t tagLen, size_t AADLen,
                      size_t payloadLen);

/**
 * @brief 更新AE操作中的AAD。
 *
 * @param operation 操作句柄。
 * @param AADdata 指向新AAD的指针。
 * @param AADdataLen 新AAD的长度。
 *
 * @since 20
 */
void TEE_AEUpdateAAD(TEE_OperationHandle operation, const void *AADdata, size_t AADdataLen);

/**
 * @brief 更新AE操作中的数据。
 *
 * @param operation 操作句柄。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_GENERIC：操作失败。
 * @since 20
 */
TEE_Result TEE_AEUpdate(TEE_OperationHandle operation, void *srcData, size_t srcLen, void *destData, size_t *destLen);

/**
 * @brief 完成AE加密操作。
 *
 * @param operation 操作句柄。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 * @param tag 指向存储计算出的tag的缓冲区的指针。
 * @param tagLen 指向tag缓冲区长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_GENERIC：操作由于其他错误失败。
 * @since 20
 */
TEE_Result TEE_AEEncryptFinal(TEE_OperationHandle operation, void *srcData, size_t srcLen, void *destData,
                              size_t *destLen, void *tag, size_t *tagLen);

/**
 * @brief 完成AE解密操作。
 *
 * @param operation 操作句柄。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 * @param tag 指向存储计算出的tag的缓冲区的指针。
 * @param tagLen tag缓冲区的长度。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_MAC_INVALID：表示计算出的tag与提供的tag不匹配。
 * @since 20
 */
TEE_Result TEE_AEDecryptFinal(TEE_OperationHandle operation, void *srcData, size_t srcLen, void *destData,
                              size_t *destLen, void *tag, size_t tagLen);

/**
 * @brief 执行非对称加密。
 *
 * @param operation 操作句柄。
 * @param params 指向此操作的参数的指针。
 * @param paramCount 参数的数量。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：操作因无效参数失败。\n
 *         TEE_ERROR_GENERIC：操作由于其他错误失败。
 * @since 20
 */
TEE_Result TEE_AsymmetricEncrypt(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount,
                                 void *srcData, size_t srcLen, void *destData, size_t *destLen);

/**
 * @brief 执行非对称解密。
 *
 * @param operation 操作句柄。
 * @param params 指向此操作的参数的指针。
 * @param paramCount 参数的数量。
 * @param srcData 指向源数据的指针。
 * @param srcLen 源数据的长度。
 * @param destData 指向目标数据的指针。
 * @param destLen 指向目标数据长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：操作因无效参数失败。\n
 *         TEE_ERROR_GENERIC：操作由于其他错误失败。
 * @since 20
 */
TEE_Result TEE_AsymmetricDecrypt(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount,
                                 void *srcData, size_t srcLen, void *destData, size_t *destLen);

/**
 * @brief 在非对称操作中对消息摘要进行签名。
 *
 * @param operation 操作句柄。
 * @param params 指向此操作参数的指针。
 * @param paramCount 参数的数量。
 * @param digest 指向消息摘要的指针。
 * @param digestLen 消息摘要的长度。
 * @param signature 指向签名的指针。
 * @param signatureLen 指向签名长度的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：操作因无效参数失败。\n
 *         TEE_ERROR_GENERIC：操作由于其他错误失败。
 * @since 20
 */
TEE_Result TEE_AsymmetricSignDigest(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount,
                                    void *digest, size_t digestLen, void *signature, size_t *signatureLen);

/**
 * @brief 在非对称操作中验证消息摘要签名。
 *
 * @param operation 操作句柄。
 * @param params 指向此操作参数的指针。
 * @param paramCount 参数的数量。
 * @param digest 指向消息摘要的指针。
 * @param digestLen 消息摘要的长度。
 * @param signature 指向签名的指针。
 * @param signatureLen 签名的长度。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：操作因无效参数失败。\n
 *         TEE_ERROR_GENERIC：操作由于其他错误失败。
 * @since 20
 */
TEE_Result TEE_AsymmetricVerifyDigest(TEE_OperationHandle operation, const TEE_Attribute *params, uint32_t paramCount,
                                      void *digest, size_t digestLen, void *signature, size_t signatureLen);

/**
 * @brief 获取涉及多个密钥的操作信息。
 *
 * @param operation 操作句柄。
 * @param operationInfoMultiple 指向获取的操作信息的指针。
 * @param operationSize [IN/OUT] 指向操作信息大小的指针。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_BAD_PARAMETERS：操作因无效参数失败。\n
 *         TEE_ERROR_SHORT_BUFFER：操作信息缓冲区不足以容纳获取到的信息。
 * @since 20
 */
TEE_Result TEE_GetOperationInfoMultiple(TEE_OperationHandle operation, TEE_OperationInfoMultiple *operationInfoMultiple,
                                        const size_t *operationSize);

/**
 * @brief 检查算法是否被支持。
 *
 * @param algId 要检查的算法。
 * @param element 密码元素。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         TEE_ERROR_NOT_SUPPORTED：算法不被支持。
 * @since 20
 */
TEE_Result TEE_IsAlgorithmSupported(uint32_t algId, uint32_t element);

#ifdef __cplusplus
}
#endif

#endif
/** @} */